package com.jt.provider.controller;


import com.sun.org.apache.bcel.internal.generic.NEW;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

@RestController
@RefreshScope
public class ProviderCacheController {
    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/provider/cache01")
    public String doUseLocalCache01(){
        return "useLocalCache'value is   "+useLocalCache;
    }
    //目标：设计1个cache，我们要将从数据库取到数据存储cache中，下次取数据从cache取。
    //1)要保证数据的正确(线程安全)
    //2)要保证效率
    private List<String> cache = new CopyOnWriteArrayList();
    @RequestMapping("/provider/cache02")
    public List<String> doUseLocalCache02(){
        //1.配置中心useLocalCache值为false，则直接从数据库取
        if(!useLocalCache){
            System.out.println("本地缓存开关没有打开，查询数据库");
            return Arrays.asList("A","B","C");//假设这是从数据库取的数据
        }else {
            //2.配置中心useLocalCache值为true，则执行如下步骤
            //2.1.从cache取数据，假如有则直接返回。
            //2.2.cache中没有数据则从数据库取数据，并将数据存储到cache中，然后返回数据
            if (cache.isEmpty()){
                synchronized (this){//静态方法使用类名.class，非静态使用this
                    if (cache.isEmpty()) {
                        System.out.println("本地缓存开关打开了，但是缓存没有数据，查询数据库");
                        //cache = Arrays.asList("A","B","C");
                        //return cache;
                        List<String> list = Arrays.asList("A", "B", "C");
                        cache.addAll(list);
                    }
                }

            }
            return cache;
        }


    }
}
